/*
 * @Description: 日期工具js
 * @Autor: bxs
 * @Date: 2021-12-15 13:30:22
 * @LastEditors: bxs
 * @LastEditTime: 2021-12-16 13:58:55
 */
import { currying } from '../基础工具类/basicTools.js'
/**
 * 获取一个月之前的日期
 * @param {String/Date} date 格式为yyyy-mm-dd
 * @returns 格式为yyyy-mm-dd的日期字符串
 */
function getLastMonth(date) {
    // 输入为空默认当天  
    if ([null,undefined,''].includes(date)) {
        date = dateF(new Date())
    }
    // 输入Date格式转字符串
    if (date instanceof Date) {
        date = dateF(date)
    }
    let arr = date.split('-');  
    let year = arr[0]; //获取当前日期的年份  
    let month = arr[1]; //获取当前日期的月份  
    let day = arr[2]; //获取当前日期的日  
    let days = new Date(year, month, 0);  
    days = days.getDate(); //获取当前日期中月的天数  
    let year2 = year;  
    let month2 = parseInt(month) - 1;  
    if (month2 == 0) {  
        year2 = parseInt(year2) - 1;  
        month2 = 12;  
    }  
    let day2 = day;  
    let days2 = new Date(year2, month2, 0);  
    days2 = days2.getDate();  
    if (day2 > days2) {  
        day2 = days2;  
    }  
    if (month2 < 10) {  
        month2 = '0' + month2;  
    }  
    let t2 = year2 + '-' + month2 + '-' + day2;  
    return t2;  
} 
/**
 * 获取一个月之后的日期
 * @param {String/Date} date 格式为yyyy-mm-dd
 * @returns 格式为yyyy-mm-dd的日期字符串
 */
function getNextMonth(date) {
    // 输入为空默认当天  
    if ([null,undefined,''].includes(date)) {
        date = dateF(new Date())
    }
    // 输入Date格式转字符串
    if (date instanceof Date) {
        date = dateF(date)
    }
    let arr = date.split('-');  
    let year = arr[0]; //获取当前日期的年份  
    let month = arr[1]; //获取当前日期的月份  
    let day = arr[2]; //获取当前日期的日  
    let days = new Date(year, month, 0); 
    days = days.getDate(); //获取当前日期中月的天数  
    let year2 = year;  
    let month2 = parseInt(month) + 1;  
    if (month2 == 13) {  
        year2 = parseInt(year2) + 1;  
        month2 = 1;  
    }  
    let day2 = day;  
    let days2 = new Date(year2, month2, 0);  
    days2 = days2.getDate();  
    if (day2 > days2) {  
        day2 = days2;  
    }  
    if (month2 < 10) {  
        month2 = '0' + month2;  
    }  
    let t2 = year2 + '-' + month2 + '-' + day2;  
    return t2;  
} 
/**
 * 获取过去日期
 * @param {Numer} num 天数
 * @param {Date} date 
 * @returns 格式为yyyy-mm-dd的日期字符串
 */
function getPast(num, date = new Date()) {  
	date.setDate(date.getDate() - num);
  	return dateF(date);	
} 
/**
 * 获取未来日期
 * @param {Numer} num 天数
 * @param {Date} date Date格式
 * @returns 格式为yyyy-mm-dd的日期字符串
 */
function getFuture(num, date = new Date()) {  
	date.setDate(date.getDate() + num);
  	return dateF(date);	
} 
/**
 * 格式化日期
 * @param {String} fmt  yyyy-mm-dd/YYYY-mm-dd HH:MM
 * @param {Date} date Date格式
 * @returns 格式为yyyy-mm-dd的日期字符串
 */
function dateFormat(fmt, date) {
    let ret;
    const opt = {
        "y+": date.getFullYear().toString(),        // 年
        "m+": (date.getMonth() + 1).toString(),     // 月
        "d+": date.getDate().toString(),            // 日
        "H+": date.getHours().toString(),           // 时
        "M+": date.getMinutes().toString(),         // 分
        "S+": date.getSeconds().toString()          // 秒
        // 有其他格式化字符需求可以继续添加，必须转化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}
/**
 * 函数柯里化 ES6
 * @param {function} fn   待柯里化函数
 * @param  {...any} rest1 携带参数
 * @returns 柯里化后函数
 */
// function currying(fn, ...rest1) {
//     // 调用柯里化后的函数的参数
//     return function(...rest2) {
//       return fn.apply(null, rest1.concat(rest2))
//     }
// }
//柯里化日期格式化函数
const dateF = currying(dateFormat, 'yyyy-mm-dd')
const getTomorrow = currying(getFuture, 1)
const getYesterday = currying(getPast, 1)

// 使用default方式导出函数，采用变量形式接受
export  default {getLastMonth, getNextMonth, getFuture, getPast, getTomorrow, getYesterday, dateF}